package com.example.supermonkeysm.security.utils;

import com.example.supermonkeysm.utils.Result;
import io.jsonwebtoken.*;
import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletResponse;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.stereotype.Component;

import java.io.IOException;
import java.util.Date;

/**
 * 封装token
 */
@Component /*如果一个配置类只配置@ConfigurationProperties注解，而没有使用@Component，那么在IOC容器中是获取不到properties 配置文件转化的bean。
            说白了 @EnableConfigurationProperties 相当于把使用 @ConfigurationProperties 的类进行了一次注入。*/
@Data
@ConfigurationProperties(prefix = "token")  //用于获取配置文件中的属性定义并绑定到Java Bean或属性中
@EnableConfigurationProperties(TokenUtils.class)    //使 使用 @ConfigurationProperties 注解的类生效
@Slf4j
public class TokenUtils {

    private String sign;//token签名（盐）
    private long timeout;//token过期时间
    // 3600000 1小时
    // 60000 1分钟
    // 20000 20秒
    @Resource
    HttpServletResponse response;

    //生成token
    public String createToken(Integer id, String username, long time) {
        JwtBuilder jwtBuilder = Jwts.builder()
                .setId(String.valueOf(id))
                .setSubject(username)
                .setIssuedAt(new Date())//创建时间
                .setExpiration(new Date(System.currentTimeMillis() + time))//过期时间
                .signWith(SignatureAlgorithm.HS256, sign);
        return jwtBuilder.compact();
    }

    //解析token获得用户信息
    public Claims analysisToken(String token) throws IOException {
        try {
            return Jwts.parser().setSigningKey(sign).parseClaimsJws(token).getBody();
        } catch (ExpiredJwtException e) {
            log.error("token过期!");
            Result.customResult(response, HttpServletResponse.SC_UNAUTHORIZED, "登录已过期,请重新登录!");
        } catch (MalformedJwtException e) {
            log.error("不是token格式!");
            Result.customResult(response, HttpServletResponse.SC_UNAUTHORIZED, "无效的token!");
        } catch (SignatureException e) {
            log.error("token后面加了不规范的字符,签名错误!");
            Result.customResult(response, HttpServletResponse.SC_UNAUTHORIZED, "无效的token!");
        } catch (IllegalArgumentException e) {
            log.error("解析的token为null或空!");
        }
        return null;
    }
}
